Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.

...powered by www.netzwerkartist.de...

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Exceptions
8 Die Funktionsbibliothek
9 Threads und nebenläufige Programmierung
10 Raum und Zeit
11 Datenstrukturen und Algorithmen
12 Dateien und Datenströme
13 Die eXtensible Markup Language (XML)
14 Grafische Oberflächen mit Swing
15 Grafikprogrammierung
16 Das Netz
17 JavaServer Pages und Servlets
18 Verteilte Programmierung mit RMI und Web–Services
19 Applets, Midlets und Sound
20 Datenbankmanagement mit JDBC
21 Reflection und Annotationen
22 Komponenten durch Bohnen
23 Logging und Monitoring
24 Sicherheitskonzepte
25 Java Native Interface (JNI)
26 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Index

Download:
- ZIP, ca. 12,5 MB
Buch bestellen

Website zum Buch
Weblog des Autors
Ihre Meinung?

Spacer
 <<   zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel

Java ist auch eine Insel
6., akt. und erw. Aufl., mit DVD
1.454 S., 49,90 Euro
Galileo Computing
ISBN 3-89842-838-9
gp 12 Dateien und Datenströme
  gp 12.1 Datei und Verzeichnis
    gp 12.1.1 Dateien und Verzeichnisse mit der Klasse File
    gp 12.1.2 Verzeichnis oder Datei? Existiert es?
    gp 12.1.3 Verzeichnis- und Dateieigenschaften/-attribute
    gp 12.1.4 Wurzelverzeichnis, Laufwerksnamen, Plattenspeicher
    gp 12.1.5 Umbenennen und Verzeichnisse anlegen
    gp 12.1.6 Verzeichnisse listen und Dateien filtern
    gp 12.1.7 Dateien berühren, neue Dateien anlegen, temporäre Dateien
    gp 12.1.8 Dateien und Verzeichnisse löschen
    gp 12.1.9 Verzeichnisse nach Dateien rekursiv durchsuchen
    gp 12.1.10 URL- und URI-Objekte aus einem File-Objekt ableiten
    gp 12.1.11 Mit Locking Dateien sperren
    gp 12.1.12 Sicherheitsprüfung
    gp 12.1.13 Mime-Typen mit dem JavaBeans Activation Framework (JAF)
    gp 12.1.14 Zugriff auf SMB-Server mit jCIFS
  gp 12.2 Dateien mit wahlfreiem Zugriff
    gp 12.2.1 Ein RandomAccessFile zum Lesen und Schreiben öffnen
    gp 12.2.2 Aus dem RandomAccessFile lesen
    gp 12.2.3 Schreiben
    gp 12.2.4 Die Länge des RandomAccessFile
    gp 12.2.5 Hin und her in der Datei
    gp 12.2.6 Wahlfreier Zugriff und Pufferung mit Unified I/O
  gp 12.3 Stream-Klassen und Reader/Writer am Beispiel von Dateien
    gp 12.3.1 Mit dem FileWriter Texte in Dateien schreiben
    gp 12.3.2 Zeichen mit der Klasse FileReader lesen
    gp 12.3.3 Kopieren mit FileOutputStream und FileInputStream
    gp 12.3.4 Das FileDescriptor-Objekt
  gp 12.4 Basisklassen für die Ein-/Ausgabe
    gp 12.4.1 Die abstrakten Basisklassen
    gp 12.4.2 Übersicht über Ein-/Ausgabeklassen
    gp 12.4.3 Die abstrakte Basisklasse OutputStream
    gp 12.4.4 Die Schnittstellen Closeable und Flushable
    gp 12.4.5 Ein Datenschlucker
    gp 12.4.6 Die abstrakte Basisklasse InputStream
    gp 12.4.7 Ressourcen wie Grafiken aus dem Klassenpfad und aus Jar–Archiven laden
    gp 12.4.8 Ströme mit SequenceInputStream zusammensetzen
    gp 12.4.9 Die abstrakte Basisklasse Writer
    gp 12.4.10 Die Schnittstelle Appendable
    gp 12.4.11 Die abstrakte Basisklasse Reader
  gp 12.5 Formatierte Textausgaben
    gp 12.5.1 Die Klassen PrintWriter und PrintStream
    gp 12.5.2 System.out, System.err und System.in
    gp 12.5.3 Geschützte Passwort-Eingaben mit der Klasse Console
  gp 12.6 Schreiben und Lesen aus Strings und Byte-Feldern
    gp 12.6.1 Mit dem StringWriter ein String-Objekt füllen
    gp 12.6.2 CharArrayWriter
    gp 12.6.3 StringReader und CharArrayReader
    gp 12.6.4 Mit ByteArrayOutputStream in ein Byte-Feld schreiben
    gp 12.6.5 Mit ByteArrayInputStream aus einem Byte-Feld lesen
  gp 12.7 Datenströme filtern und verketten
    gp 12.7.1 Writer als Filter verketten
    gp 12.7.2 Gepufferte Unicode-Ausgabe mit BufferedWriter
    gp 12.7.3 Gepufferte Unicode-Eingabe mit BufferedReader
    gp 12.7.4 LineNumberReader zählt automatisch Zeilen mit
    gp 12.7.5 Daten mit der Klasse PushbackReader zurücklegen
    gp 12.7.6 DataOutputStream/DataInputStream
    gp 12.7.7 Basisklassen für Filter
    gp 12.7.8 Die Basisklasse FilterWriter
    gp 12.7.9 Ein LowerCaseWriter
    gp 12.7.10 Eingabenmit der Klasse FilterReader filtern
  gp 12.8 Vermittler zwischen Byte-Streams und Unicode-Strömen
    gp 12.8.1 Datenkonvertierung durch den OutputStreamWriter
    gp 12.8.2 Automatische Konvertierungen mit dem InputStreamReader
  gp 12.9 Kommunikation zwischen Threads mit Pipes
    gp 12.9.1 PipedOutputStream und PipedInputStream
    gp 12.9.2 PipedWriter und PipedReader
  gp 12.10 Datenkompression
    gp 12.10.1 Java-Unterstützung beim Komprimieren und Zusammenpacken
    gp 12.10.2 Datenströme komprimieren
    gp 12.10.3 Zip-Archive
    gp 12.10.4 Jar-Archive
  gp 12.11 Prüfsummen
    gp 12.11.1 Die Schnittstelle Checksum
    gp 12.11.2 Die Klasse CRC32
    gp 12.11.3 Die Adler32-Klasse
  gp 12.12 Persistente Objekte und Serialisierung
    gp 12.12.1 Objekte mit der Standard-Serialisierung speichern
    gp 12.12.2 Objekte über die Standard-Serialisierung lesen
    gp 12.12.3 Die Schnittstelle Serializable
    gp 12.12.4 Nicht serialisierbare Attribute aussparen
    gp 12.12.5 Das Abspeichern selbst in die Hand nehmen
    gp 12.12.6 Tiefe Objektkopien
    gp 12.12.7 Versionenverwaltung und die SUID
    gp 12.12.8 Wie die ArrayList serialisiert
    gp 12.12.9 Probleme mit der Serialisierung
    gp 12.12.10 Serialisieren in XML-Dateien
    gp 12.12.11 JavaBeans Persistence
    gp 12.12.12 XStream
  gp 12.13 Tokenizer
    gp 12.13.1 StreamTokenizer
    gp 12.13.2 CSV-(Comma Separated Values-)Dateien verarbeiten


Galileo Computing

12.11 Prüfsummen  downtop

Damit Fehler bei Dateien oder bei Übertragungen von Daten auffallen, werden vor der Übertragung Prüfsummen (engl. checksum) gebildet und mit dem Paket versendet. Der Empfänger berechnet diese Prüfsumme neu und vergleicht sie mit dem übertragenen Wert. Stimmt der berechnete Wert mit dem übertragenen überein, so war die Übertragung höchstwahrscheinlich in Ordnung. Es sollte ziemlich unwahrscheinlich sein, dass eine Änderung einzelner Bits nicht auffällt. Prüfsummen erkennen auch beschädigte Archive. Pro Datei wird eine Prüfsumme berechnet. Soll die Datei entpackt werden, so errechnen wir wieder die Summe. Ist diese fehlerhaft, muss auch die Datei fehlerhaft sein. (Wir wollen hier ausschließen, dass zufälligerweise die Prüfsumme fehlerhaft ist, was natürlich ebenfalls der Fall sein kann.)


Galileo Computing

12.11.1 Die Schnittstelle Checksum  downtop

Wir finden Zugang zur Prüfsummenberechnung über die Schnittstelle java.util.zip. Checksum, die für ganz allgemeine Prüfsummen steht. Eine Prüfsumme wird entweder für ein Feld oder ein Byte berechnet. Checksum liefert die Schnittstelle zum Initialisieren und Auslesen von Prüfsummen, die die konkreten Prüfsummen-Klassen implementieren müssen.


interface java.util.zip.Checksum

  • long getValue() Liefert die aktuelle Prüfsumme.
  • void reset() Setzt die aktuelle Prüfsumme auf einen Anfangswert.
  • void update( int b ) Aktualisiert die aktuelle Prüfsumme mit b.
  • void update( byte[] b, int off, int len ) Aktualisiert die aktuelle Prüfsumme mit dem Feld.

Die Standardbibliothek bietet bisher zwei Klassen für die Prüfsummenberechnung als Implementierungen von Checksum!

  • java.util.zip.CRC32. CRC32 basiert auf einer zyklischen Redundanzprüfung und testet etwa Zip-Archive oder PNG-Grafiken.
  • java.util.zip.Adler32. Die Berechnung von CRC32-Prüfsummen kostet – obwohl in C programmiert – viel Zeit. Eine Adler32-Prüfsumme kann wesentlich schneller berechnet werden und bietet ebenso eine geringe Wahrscheinlichkeit, dass Fehler unentdeckt bleiben.

Galileo Computing

12.11.2 Die Klasse CRC32  downtop

Oft sind Polynome die Basis der Prüfsummenberechung. Eine häufig für Dateien verwendete Prüfsumme ist CRC32, und das bildende Polynom lautet:

x32  +x26  +x23  +x22  +x16  +x12  +x11  +x10  +x+x+x+x+x+x+1

Nun lässt sich zu einer 32-Bit-Zahl eine Prüfsumme berechnen, die genau für diese vier Bytes steht. Damit bekommen wir aber noch keinen ganzen Block kodiert. Um das zu erreichen, berechnen wir den Wert eines Zeichens und Xor-verknüpfen den alten CRC-Wert mit dem neuen. Jetzt lassen sich beliebig Blöcke sichern. Die Berechnung ist insgesamt sehr zeitaufwändig, und Adler32 stellt eine schnellere Alternative dar.


Beispiel CRC32 berechnet eine Prüfsumme entweder für ein Byte oder für ein Feld. In aller Kürze sieht ein Programm zur Berechnung von Prüfsummen für Dateien dann folgendermaßen aus (in ist ein InputStream-Objekt):
CRC32 crc = new CRC32(); 
byte[] ba = new byte[ (int)in.available() ]; 
in.read( ba ); 
crc.update( ba ); 
in.close();

CRC32 implementiert nicht nur alle Methoden, sondern fügt noch zwei Funktionen und natürlich einen Konstruktor hinzu.


class java.util.zip.CRC32 
implements Checksum

  • CRC32() Erzeugt ein neues CRC32-Objekt mit der Start-Prüfsumme 0.
  • long getValue() Liefert den CRC32-Wert.
  • void reset() Setzt die interne Prüfsumme auf 0.
  • void update( byte[] b ) Aktualisiert die Prüfsumme mit dem Feld durch Aufruf von update(b, 0, b.length).
  • void update( int b ) Implementiert update() aus Checksum für ein Byte. Nativ implementiert.
  • void update( byte[] b, int off, int len ) Implementiert update() aus Checksum für ein Feld. Nativ implementiert.

CRC eines Datenstroms berechnen

Eine Möglichkeit, die CRC32 eines Datenstroms zu berechnen, bestünde darin, einen Datenstrom entgegenzunehmen und anschließend so lange Byte-Folgen auszulesen, bis available() null liefert. An diesem Punkt lässt sich mit update() jeweils die Prüfsumme korrigieren. Bei großen Dateien ist es sicherlich angebracht, Blöcke einzulesen, die crc.update(byte[]) verarbeitet. Für diese Aufgabe verfügt die Java-Bibliothek über zwei Filter-Klassen: CheckedInputStream und CheckedOutputStream. Beide sind Filter, die existierende andere Streams ummanteln und gleichzeitig die Berechnung erledigen.

Listing 12.32    com/javatutor/insel/io/CRC32Demo.java, main()

InputStream in = CRC32Demo.class.getResourceAsStream( "/lyrics.txt" ); 
try 
{ 
  CRC32 crc = new CRC32(); 
  InputStream cis = new CheckedInputStream( in, crc ); 
 
  while ( cis.read() != -1 ) { /* Bis Ende lesen. */ } 
  System.out.printf( "%X", crc.getValue() ); 
} 
catch ( IOException e ) { 
  e.printStackTrace(); 
} 
finally { 
  try { in.close(); } catch ( Exception e ) { } 
}

Galileo Computing

12.11.3 Die Adler32-Klasse  toptop

Der Algorithmus ist nach seinem Programmierer Mark Adler benannt und stellt eine Erweiterung des Fletcher [Fletcher, J. G., »An Arithmetic Checksum for Serial Transmissions«. IEEE Transactions on Communications, Ausgabe. COM-30, Nummer. 1, Januar 1982, Seite 247 – 252. ] -Algorithmus dar. Der Adler32-Algorithmus ist im ITU-T X.224/ISO 8073-Standard definiert und gilt für 32-Bit-Zahlen. Die Adler32-Prüfsumme setzt sich aus zwei Summen für ein Byte zusammen. s1 ist die Summe aller Bytes und s2 die Summe aller s1. Beide Werte werden Modulo 65521 genommen. Am Anfang ist s1 = 1 und s2 = 0. Die Adler32-Prüfsumme speichert den Wert als s2 * 65536 + s1 in der MSB-Reihenfolge (Most-Significant-Byte First, Netzwerkreihenfolge).

Eine Beschreibung der Kompression und des Adler32-Algorithmus findet sich im Internet-Draft »ZLIB Compressed Data Format Specification version 3.3«.


class java.util.zip.Adler32 
implements Checksum

  • Adler32() Erzeugt ein neues Adler32-Objekt mit der Start-Prüfsumme 1.
  • long getValue() Liefert den Adler32-Wert.
  • void reset() Setzt die interne Prüfsumme auf 1.

Aus der Schnittstelle Checksum implementiert Adler32 natürlich auch die update()-Methoden.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.





 <<   zurück



Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de